package com.xxx.datalake.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Mapping;
import org.springframework.data.elasticsearch.annotations.Setting;

import java.util.List;
import java.util.Map;

/**
 * @ Project: datalake-unstructured
 * @ Since: 2022/9/13 10:56
 * @ Description:
 */

/**
 * 1、@Data @AllArgsConstructor @NoArgsConstructor @ToString
 * 在实体上使用这四个注解，作用：自动生成get、set方法、有参构造、无参构造、toString方法
 *
 * 2、@Document(indexName = "test1",shards = 1,replicas = 1,refreshInterval = "1s",indexStoreType = "fs")
 * String indexName(); //索引库的名称，建议以项目的名称命名,索引名称必须是小写的，不能用下划线开头，不能包含逗号
 * String type() default ""; //类型(!!!ES7之后已弃用!!!)
 * short shards() default 5; //默认分区数
 * short replicas() default 1; //每个分区默认的备份数
 * String refreshInterval() default "1s"; //刷新间隔
 * String indexStoreType() default "fs"; //索引文件存储类型，支持的不同存储类型，Simple FS（简单文件系统），NIO FS（NIO文件系统），MMap FS（内存映射文件系统）
 */

@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Document(indexName = "datalake_metadata_test1",shards = 1,replicas = 1)
@Mapping(mappingPath = "/esConfig/builder-mapping.json")    //相当于ES中的mapping
@Setting(settingPath = "/esConfig/builder-seting.json")     //相当于ES中的settings
public class Metadata {

    @Id
    private Long id;

    /**
     * @Field(type = FieldType.Text, index = false, format = DateFormat.date, analyzer = "ik_max_word")
     * type : 字段数据类型,自动检测属性的类型，可以根据实际情况自己设置
     * FieldType {Text, Integer,Long,Date,Float,Double,Boolean,Object,Auto,Nested,Ip,Attachment,Keyword}
     * index : 是否分词(默认:true),一般默认分词就好，除非这个字段你确定查询时不会用到
     * analyzer : 分词器类型,ES的分词器，其实就是插件，是工具。而对于分词的使用，其实可以分为读时分词和写时分词。
     * searchAnalyzer : 指定字段搜索时使用的分词器。
     * 读时分词，发生在用户查询时，ES 会即时地对用户输入的关键词进行分词，分词结果只存在内存中，当查询结束时，分词结果也会随即消失。
     * indexAnalyzer : 指定字段建立索引时指定的分词器
     * 写时分词，发生在文档写入时，ES 会对文档进行分词后，将结果存入倒排索引，该部分最终会以文件的形式存储于磁盘上，不会因查询结束或者 ES 重启而丢失。
     * ignoreFields : 如果某个字段需要被忽略
     */

    /**
     * 字符串：1、地质数据2、地形数据3、资源数据
     */
    private String namespace;

    /**
     * 用户权限，用数字（1，2）表示等级，1表示等级最高，依次递减
     * 等级高的可以拥有等级低的所有权限
     */
    private Integer userPermission;

    /**
     * 具体类型（详见入湖数据类型的具体类型一栏）
     */
    private String dataSource;

    /**
     * 原始数据文件名
     */
    private String originalFileName;

    /**
     * 原始存储位置
     */
    private String originalLocation;

    /**
     * 描述信息(字符串：地矿？)
     */
    private String description;

    /**
     * （mysql数据库提取相关字段，非半结构数据用户自定义，json、xml可以提取）（包含：字段名、字段数据类型、字段描述信息）
     */
    private List<sqlField> sqlFieldList;

    /**
     * 非结构化数据，使用键值对，提供用户自定义
     */
    private Map<String,String> userDefinedField;

}
